#include<iostream>
#include<string>
#include<vector>
#include<thread>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>

using namespace std;

void threadrun(string name,int num)
{
    while(num)
    {
        cout<<name<<" num: "<<num<<endl;
        num--;
        sleep(1);
    }
}

int main()
{
    string name="thread_1";
    thread mythread(threadrun,name,10);
    
    while(true)
    {
        cout<<"main thread..."<<endl;
        sleep(1);
    }
    
    mythread.join();

    return 0;
}







//------------------------------------------------------------------------------------------

// const int num=10;

// void *threadrun(void* args)
// {
//     pthread_detach(pthread_self());
//     string name=static_cast<const char*>(args);
//     while(true)
//     {
//         cout<<name<<"is running"<<endl;
//         sleep(3);
//         break;
//     }
//     //exit(1);//exit是进程退出，不能终止线程
//     //return args;
//     pthread_exit(args);
// }

// string PrintToHex(pthread_t &tid)
// {
//     char buffer[64];
//     snprintf(buffer,sizeof(buffer),"0x%lx",tid);
//     return buffer;
// }

// int main()
// {
//     vector<pthread_t> tids;

//     for(int i=0;i<num;i++)
//     {
//         pthread_t tid;
//         char *name=new char[128];
//         snprintf(name,128,"thread-%d",i+1);//名字
//         pthread_create(&tid,nullptr,threadrun,name); //传递线程的名字

//         //保存所有线程的id信息
//         //tids.push_back(tid);
//         tids.emplace_back(tid);
//     }

//     for(auto tid:tids)
//     {
//         pthread_detach(tid);  //主线程分离新线程，新线程必须存在
//     }

//     //等待
//     for(auto tid:tids)
//     {
//         // pthread_cancel(tid);//取消
//         // cout<<"cancel:"<<PrintToHex(tid)<<endl;
//         void *result=nullptr;  //现成被取消，被取消的线程的返回结果是-1
//         int n=pthread_join(tid,&result);
//         //cout<<PrintToHex(tid)<<" quit..."<<endl;
//         cout<<(long long int)result<<" quit...,n:"<<n<<endl;
//         //delete (const char*)name; 
//     }

//     sleep(100);    
//     return 0;
// }







//--------------------------------------------------------------------------------------------------------

// class ThreadData
// {
// public:
//     int Excute()
//     {
//         return x+y;
//     }
// public:
//     std::string name;
//     int x;
//     int y;
// };

// class ThreadResult
// {
// public:
//     std::string print()
//     {
//         return std::to_string(x)+"+"+std::to_string(y)+"="+std::to_string(result);
//     }
// public:
//     int x;
//     int y;
//     int result;
// };

// void *threadRun(void *args)
// {
//     //std::string name=(const char*)args;
//     //int a=*(int*)args;
//     ThreadData *td=static_cast<ThreadData*>(args);//(ThreadData*)args  
//     ThreadResult *result=new ThreadResult();
//     int cnt=10;
//     while(cnt)
//     {
//         sleep(1);

//         std::cout<<td->name<<" run ..."<<",cnt:"<<cnt--<<std::endl;
//         result->result=td->Excute();
//         result->x=td->x;
//         result->y=td->y;
//         break;

//     }
//     delete td;
//     return (void*)result;
// }

// std::string PrintToHex(pthread_t &tid)
// {
//     char buffer[64];
//     snprintf(buffer,sizeof(buffer),"0x%lx",tid);
//     return buffer;
// }

// const int num=10;

// int main()
// {


//     pthread_t tid;

//     ThreadData *td=new ThreadData(); //在堆上申请空间
//     td->name="thread-1";
//     td->x=10;
//     td->y=20;

//     int n=pthread_create(&tid,nullptr,threadRun,td);
//     if(n!=0)
//     {
//         std::cerr<<"create thread error"<<std::endl;
//         return 1;
//     }

//     std::string tid_str=PrintToHex(tid);
//     std::cout<<"tid:"<<tid_str<<std::endl;

//     std::cout<<"main thread join begin..."<<std::endl;

//     ThreadResult* result=nullptr;//开辟了空间
//     n=pthread_join(tid,(void**)&result); //保证main线程最后退出
//     if(n==0)
//     {
//         std::cout<<"main thread wait sucess,new thread exit code:"<<result->print()<<std::endl;
//     }


//     return 0;      
// }
